package com.qhx.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Collections;

/**
 * @author 本郡主是喵
 */
public class JzmGenerate
{

    public static void main(String[] args)
    {
        // 这个字符串,从table
        String tabStr =
                "project_funds\n" +
                "project_progress\n" +
                "project_resources\n" +
                "project_results\n" +
                "projects\n";

        // 生成要拼接的表前缀，如tb_str、ts_str、tb_1字符串,设置tb_,只会拼接tb_的
        String prefix = "";
        // 过滤表前缀，生成的实体类把前缀忽略
        String filterPrefix = "";
        // 格式化之后table字符串
        String tableStr = JzmGenerate.tabStrFormat(tabStr, prefix);

        JzmGenerate.generateAll(tableStr, filterPrefix);
    }

    /**
     * @param tableStr     表格字符串: 如 " sys_user,sys_role "
     * @param filterPrefix 过滤表格前缀： 如 sys_
     */
    public static void generateAll(final String tableStr, final String filterPrefix)
    {
        // TODO 设置url。用户名和密码
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/bcos_project?characterEncoding=utf-8&serverTimezone=Asia/Shanghai",
                        "root", "123456")
                .globalConfig(builder ->
                {
                    builder.author("本郡主是喵") // 设置作者
                            .enableSwagger() // TODO 开启 swagger 模式,选的话+依赖
                            .dateType(DateType.TIME_PACK)
                            .outputDir("C:\\Users\\qhx20\\Desktop\\TODO\\基于区块链的项目信息管理系统\\graduation-framework\\src\\main\\java");
                    // TODO 指定输出目录
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) ->
                {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT)
                    {
                        // 自定义类型转换
                        return DbColumnType.INTEGER;
                    }
                    return typeRegistry.getColumnType(metaInfo);

                }))
                .packageConfig(builder ->
                {
                    builder.parent("com.graduate") // 设置父包名
                            .entity("entity")
                            .moduleName("framework") // 设置父包模块名,我这里没有模块名
                            // TODO C:\Users\qhx20\Desktop\wms\wms-h\src\main\resources
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "C:\\Users\\qhx20\\Desktop\\TODO\\基于区块链的项目信息管理系统\\graduation-framework\\src\\main\\resources\\" +
                                    "mapper")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder ->
                {
                    // TODO
                    builder.addInclude(tableStr) // 设置需要生成的表名
                            .addTablePrefix(filterPrefix)// 设置过滤表前缀
                            // 设置controller
                            .controllerBuilder().enableRestStyle()  // 启用rest风格
                            // 设置entity实体
                            .entityBuilder().enableLombok() // 开lombok
                            .enableFileOverride() // 覆盖已有文件
                            // 设置service 格式化生成Service.java文件，相当于把I过滤了
                            .serviceBuilder().formatServiceFileName("%sService")
                            // 设置 mapper
                            .mapperBuilder().mapperAnnotation(org.apache.ibatis.annotations.Mapper.class); // 开启mapper注解

                })
                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }


    /**
     * @param tabStr 表格字符串 : 就是直接从 在mysql客户端执行 “show tables;” 命令之后，直接复制粘贴的结果。
     * @param prefix 要格式化的表名称字符串前缀 ( 如 sys_user 表前缀为 sys_ )
     * @return 表名称列表 ( 如 sys_user,sys_role )
     */
    public static String tabStrFormat(String tabStr, String prefix)
    {
        StringBuilder stb = new StringBuilder();
        String[] splits = tabStr.split("\n");
        for (String split : splits)
        {
            if (prefix == null)
            {
                stb.append(split);
                stb.append(",");
            } else if (split.startsWith(prefix))
            {
                stb.append(split);
                stb.append(",");
            }
        }
        return stb.substring(0, stb.toString().length() - 1);
    }

}